跳到主要内容

JZ41 和为S的连续正数序列

https://www.nowcoder.com/practice/c451a3fd84b64cb19485dad758a55ebe

import java.util.ArrayList;
public class Solution {
public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) {
// 思路:双指针(以后这种要求取数组中连续一段的题目要快速想到双指针)
// 然后高中知识:
// 等差数列 {an} 的通项公式为:(a0+an)*n/2
// 1、2、3、4、5、6、7
ArrayList<ArrayList<Integer> > result = new ArrayList<>();
int low = 1,high = 2;
while (low < high) {
// 求和公式
int cur = (low + high) * (high - low + 1) / 2;
if (cur == sum) {
// 把当前找到的这段内容加进来
ArrayList<Integer> list = new ArrayList<>();
for (int i = low; i <= high; i++) {
list.add(i);
}
result.add(list);
// 因为已经找到合适的了,所以得移动 low 下标逼迫 high 下标下一次移动
low++;
}
//如果当前窗口内的值之和大于sum,那么左边窗口右移一下
else if (cur > sum) {
low++;
}
//如果当前窗口内的值之和小于sum,那么右边窗口右移一下
else {
high++;
}
}

return result;
}
}